1   /*
2    * Copyright (c) 2002, 2007, Oracle and/or its affiliates. All rights reserved.
3    * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4    *
5    * This code is free software; you can redistribute it and/or modify it
6    * under the terms of the GNU General Public License version 2 only, as
7    * published by the Free Software Foundation.
8    *
9    * This code is distributed in the hope that it will be useful, but WITHOUT
10   * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11   * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
12   * version 2 for more details (a copy is included in the LICENSE file that
13   * accompanied this code).
14   *
15   * You should have received a copy of the GNU General Public License version
16   * 2 along with this work; if not, write to the Free Software Foundation,
17   * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18   *
19   * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20   * or visit www.oracle.com if you need additional information or have any
21   * questions.
22   */
23  
24  /*
25   * @test
26   * @bug 4635086
27   * @library ../UTIL
28   * @build TestUtil
29   * @run main TestKATForECB_VT
30   * @summary Known Answer Test for AES cipher with ECB mode
31   * @author Valerie Peng
32   */
33  import java.security.*;
34  import javax.crypto.*;
35  import javax.crypto.spec.*;
36  import java.math.*;
37  import com.sun.crypto.provider.*;
38  
39  import java.util.*;
40  
41  public class TestKATForECB_VT
42  {
43      private static final String ALGO = "AES";
44      private static final String MODE = "ECB";
45      private static final String PADDING = "NoPadding";
46  
47      private static String[][] CTS = {
48          // Cipher Texts for 128-bit key
49          {
50  "3AD78E726C1EC02B7EBFE92B23D9EC34",
51  "45BC707D29E8204D88DFBA2F0B0CAD9B",
52  "161556838018F52805CDBD6202002E3F",
53  "F5569B3AB6A6D11EFDE1BF0A64C6854A",
54  "64E82B50E501FBD7DD4116921159B83E",
55  "BAAC12FB613A7DE11450375C74034041",
56  "BCF176A7EAAD8085EBACEA362462A281",
57  "47711816E91D6FF059BBBF2BF58E0FD3",
58  "B970DFBE40698AF1638FE38BD3DF3B2F",
59  "F95B59A44F391E14CF20B74BDC32FCFF",
60  "720F74AE04A2A435B9A7256E49378F5B",
61  "2A0445F61D36BFA7E277070730CF76DA",
62  "8D0536B997AEFEC1D94011BAB6699A03",
63  "674F002E19F6ED47EFF319E51FAD4498",
64  "292C02C5CB9163C80AC0F6CF1DD8E92D",
65  "FA321CF18EF5FE727DD82A5C1E945141",
66  "A5A7AFE1034C39CCCEBE3C584BC0BE05",
67  "4FF5A52E697E77D081205DBDB21CEA39",
68  "209E88DC94C9003000CE0769AF7B7166",
69  "5DEE41AF864CB4B650E5F51551824D38",
70  "A79A63FA7E4503AE6D6E09F5F9053030",
71  "A48316749FAE7FAC7002031A6AFD8BA7",
72  "D6EEE8A7357A0E1D64262CA9C337AC42",
73  "B013CA8A62A858053E9FB667ED39829E",
74  "DF6EA9E4538A45A52D5C1A43C88F4B55",
75  "7D03BA451371591D3FD5547D9165C73B",
76  "0E0426281A6277E186499D365D5F49FF",
77  "DBC02169DD2059E6CC4C57C1FEDF5AB4",
78  "826590E05D167DA6F00DCC75E22788EB",
79  "34A73F21A04421D9786335FAAB49423A",
80  "ED347D0E0128EE1A7392A1D36AB78AA9",
81  "EE944B2FE6E9FC888042608DA9615F75",
82  "9E7C85A909EF7218BA7947CFB4718F46",
83  "811AE07A0B2B1F816587FA73699AE77D",
84  "68466FBF43C2FE13D4B18F7EC5EA745F",
85  "D20B015C7191B219780956E6101F9354",
86  "5939D5C1BBF54EE1B3E326D757BDDE25",
87  "B1FDAFE9A0240E8FFEA19CE94B5105D3",
88  "D62962ECE02CDD68C06BDFEFB2F9495B",
89  "B3BB2DE6F3C26587BA8BAC4F7AD9499A",
90  "E0B1072D6D9FF703D6FBEF77852B0A6B",
91  "D8DD51C907F478DE0228E83E61FD1758",
92  "A42DFFE6E7C1671C06A25236FDD10017",
93  "25ACF141550BFAB9EF451B6C6A5B2163",
94  "4DA7FCA3949B16E821DBC84F19581018",
95  "7D49B6347CBCC8919C7FA96A37A7A215",
96  "900024B29A08C6721B95BA3B753DDB4D",
97  "6D2182FB283B6934D90BA7848CAB5E66",
98  "F73EF01B448D23A4D90DE8B2F9666E7A",
99  "4AD9CDA2418643E9A3D926AF5E6B0412",
100 "7CAEC8E7E5953997D545B033201C8C5B",
101 "3C43CA1F6B6864503E27B48D88230CF5",
102 "44F779B93108FE9FEEC880D79BA74488",
103 "9E50E8D9CFD3A682A78E527C9072A1CF",
104 "68D000CBC838BBE3C505D6F814C01F28",
105 "2CB2A9FEC1ACD1D9B0FA05205E304F57",
106 "01EB2806606E46444520A5CC6180CD4B",
107 "DAA9B25168CC702326F217F1A0C0B162",
108 "3E07E648975D9578D03555B1755807ED",
109 "0B45F52E802C8B8DE09579425B80B711",
110 "659595DA0B68F6DF0DD6CA77202986E1",
111 "05FF42873893536E58C8FA98A45C73C4",
112 "B5B03421DE8BBFFC4EADEC767339A9BD",
113 "788BCD111ECF73D4E78D2E21BEF55460",
114 "909CD9EC6790359F982DC6F2393D5315",
115 "332950F361535FF24EFAC8C76293F12C",
116 "A68CCD4E330FFDA9D576DA436DB53D75",
117 "27C8A1CCFDB0B015D1ED5B3E77143791",
118 "D76A4B95887A77DF610DD3E1D3B20325",
119 "C068AB0DE71C66DAE83C361EF4B2D989",
120 "C2120BCD49EDA9A288B3B4BE79AC8158",
121 "0C546F62BF2773CD0F564FCECA7BA688",
122 "18F3462BEDE4920213CCB66DAB1640AA",
123 "FE42F245EDD0E24B216AEBD8B392D690",
124 "3D3EEBC8D3D1558A194C2D00C337FF2B",
125 "29AAEDF043E785DB42836F79BE6CBA28",
126 "215F90C6744E2944358E78619159A611",
127 "8606B1AA9E1D548E5442B06551E2C6DC",
128 "987BB4B8740EC0EDE7FEA97DF033B5B1",
129 "C0A3500DA5B0AE07D2F450930BEEDF1B",
130 "525FDF8312FE8F32C781481A8DAAAE37",
131 "BFD2C56AE5FB9C9DE33A6944572A6487",
132 "7975A57A425CDF5AA1FA929101F650B0",
133 "BF174BC49609A8709B2CD8366DAA79FE",
134 "06C50C43222F56C874B1704E9F44BF7D",
135 "0CEC48CD34043EA29CA3B8ED5278721E",
136 "9548EA34A1560197B304D0ACB8A1698D",
137 "22F9E9B1BD73B6B5B7D3062C986272F3",
138 "FEE8E934BD0873295059002230E298D4",
139 "1B08E2E3EB820D139CB4ABBDBE81D00D",
140 "0021177681E4D90CEAF69DCED0145125",
141 "4A8E314452CA8A8A3619FC54BC423643",
142 "65047474F7222C94C6965425FF1BFD0A",
143 "E123F551A9C4A8489622B16F961A9AA4",
144 "EF05530948B80915028BB2B6FE429380",
145 "72535B7FE0F0F777CEDCD55CD77E2DDF",
146 "3423D8EFC31FA2F4C365C77D8F3B5C63",
147 "DE0E51C264663F3C5DBC59580A98D8E4",
148 "B2D9391166680947AB09264156719679",
149 "10DB79F23B06D263835C424AF749ADB7",
150 "DDF72D27E6B01EC107EA3E005B59563B",
151 "8266B57485A5954A4236751DE07F6694",
152 "669A501E1F1ADE6E5523DE01D6DBC987",
153 "C20C48F2989725D461D1DB589DC0896E",
154 "DE35158E7810ED1191825D2AA98FA97D",
155 "4FE294F2C0F34D0671B693A237EBDDC8",
156 "087AE74B10CCBFDF6739FEB9559C01A4",
157 "5DC278970B7DEF77A5536C77AB59C207",
158 "7607F078C77085184EAA9B060C1FBFFF",
159 "9DB841531BCBE7998DAD19993FB3CC00",
160 "D6A089B654854A94560BAE13298835B8",
161 "E1E223C4CF90CC5D195B370D65114622",
162 "1CBED73C50D053BDAD372CEEE54836A1",
163 "D309E69376D257ADF2BFDA152B26555F",
164 "740F7649117F0DEE6EAA7789A9994C36",
165 "76AE64417C297184D668C5FD908B3CE5",
166 "6095FEA4AA8035591F1787A819C48787",
167 "D1FF4E7ACD1C79967FEBAB0F7465D450",
168 "5F5AD3C42B9489557BB63BF49ECF5F8A",
169 "FB56CC09B680B1D07C5A52149E29F07C",
170 "FF49B8DF4A97CBE03833E66197620DAD",
171 "5E070ADE533D2E090ED0F5BE13BC0983",
172 "3AB4FB1D2B7BA376590A2C241D1F508D",
173 "58B2431BC0BEDE02550F40238969EC78",
174 "0253786E126504F0DAB90C48A30321DE",
175 "200211214E7394DA2089B6ACD093ABE0",
176 "0388DACE60B6A392F328C2B971B2FE78",
177 "58E2FCCEFA7E3061367F1D57A4E7455A"
178         },
179         // Cipher Texts for 192-bit key
180         {
181 "6CD02513E8D4DC986B4AFE087A60BD0C",
182 "423D2772A0CA56DAABB48D2129062987",
183 "1021F2A8DA70EB2219DC16804445FF98",
184 "C636E35B402577F96974D8804295EBB8",
185 "1566D2E57E8393C19E29F892EA28A9A7",
186 "883C878FED70B36CC09D040F9619DD19",
187 "06734593A974965790E715594FC34AA9",
188 "F19B389948D9A45534E5BD36C984134A",
189 "D8410DFC14FA6D175EC968EA8CAC514C",
190 "7E6C6EBB4029A177CF7B2FDD9AC6BB7A",
191 "4B51DD4850DC0A6C3A46D924003D2C27",
192 "2E510A9D917B15BE32A192B12A668F23",
193 "88F6F79962B0FB77FEA8E7C632D3108E",
194 "A3A35AB1D88DAF07B52794A0F065383A",
195 "DC6CC878433E2B3BB193049A4ECBFC53",
196 "EFCD3763EB7B1A415938248A9A5B4FD5",
197 "AB7E9FB9A66DBE5BB44854F07D9015EE",
198 "8B8E9D3365F8F6743ECF7E33E99255A4",
199 "54D37B4F176FF3D8F6AFC866066D8572",
200 "E83310889480FBF3C00342E3126D0D02",
201 "D321AB2511F92F098174AA2DE6E85DA2",
202 "D8E3F40B1112D5149D58C481DFA9983F",
203 "2454C4E0806639DDF19854D6C68054AD",
204 "A5506D410F7CA32F3955DD79D9D09418",
205 "7908EE40677699568A7DC1AA317C7E4E",
206 "B4B7B29DD43B2F5CF765E25192273982",
207 "92AFE9668159BEFFE2A86F8503260164",
208 "5C36A232FBA6D187A84657AD4028B18F",
209 "A2E994DFAB3A798DF8F54F6DA87E58E2",
210 "6CDAB10A72ADF77D71D0765BAAE95631",
211 "9FE3C801BCAAF7BB800F2E6BF3278E21",
212 "B459D90D9A6C392E5493BC91CF5A0863",
213 "0518A9FA5007F6787E0FB4E5AC27D758",
214 "BED9795415D28599700ED7952384A963",
215 "F0140421173D60251EF6CAB0229B1B50",
216 "460EB4652B3F6779EA28CB11B37529ED",
217 "C4283D351C960A6AC13CD19CCF03AE38",
218 "6815A10047B2C834A798EBDCC6786C75",
219 "99BA19F0CDD5990D0386B32CE56C9C4C",
220 "DE76F62C61E07915162DA13E79679DEC",
221 "DD0325D6854803D06D1D2277D5FB8D67",
222 "580B71A41DE37D6FAC83CCB0B3BB1C97",
223 "E9B1AB470A1B02EF0FF5E6754A092C96",
224 "8590620F5AF5993B7410282F4126BC1F",
225 "8D4914D2F1B22B2E268E66E532D29D7C",
226 "FD826CE48E62C5E30867044B86BA4B56",
227 "100E7B831C9F35FA1271F5F1316C6FCF",
228 "0A2DD0C17F68B996AA96C007003D0B31",
229 "C95F68C57E06B0A2E1F623C83C5D80BF",
230 "571CAFC92C7C8A5EC54C0741E186905C",
231 "22514353E95312C112255E1EED0B2DF6",
232 "791A8BF462BD17580BD9152C6D11C6C5",
233 "5882A0178D548F84A165DB809C60DC28",
234 "3CE4A90EED4458CA6039E42DDADB71C3",
235 "D3CBAB261207A16BE2751E77044FD7C9",
236 "24E32B698A7B32217093628B01F424AB",
237 "9F6AFC0AF27CF565110C77E3C24F4F5B",
238 "E088AA5CDA20EF267BB039B00C72C45B",
239 "5CF1018B7E0BA1775601C2E279900360",
240 "3B1A7388B89FB9416AD8753CF5AF35D2",
241 "137FA4ED00AFCD9F5D8BC0D14BD5837A",
242 "806F5C9B663559BB56F234881E4A3E60",
243 "8069A449152292DF2DE8642992C632B6",
244 "37C6CF2A1ABD1B1F1922B46C7B4A280D",
245 "7A2835260E5A0AA2B5DC301800EC8438",
246 "EE81FAF2F9058213FFCACF281CB8509E",
247 "57F22D93C37129BA331FDBA38E005A1E",
248 "EC798782E87B7D9F780CC3C3A46519B5",
249 "43EA28497F5D40E3A4744FA2EDAA42DE",
250 "91F004E7DEBF41B3414DD8C5C317372C",
251 "C249EAE54E7B4DF43B938C1B4CC28314",
252 "32C289D7EEFB99D2F17AD7B7D45FE1EC",
253 "A675FB2E8DDBF810CEF01CF2B728CD2B",
254 "A418AAAB6E6921CC731AA8A349386080",
255 "2E2B0F44863E67D9B0215C4ABD60417F",
256 "F0AF7CB19E911D481F6426DAEFDD2240",
257 "CB1304DAAA2DF6878F56AC2E0F887E04",
258 "B1B70A7E6A0CD1916D9B78BEA19084AE",
259 "0CDE9F9BE646A5FCE3436B794A9CFC65",
260 "68C7946D476A0A36674B36AFD7E5DF33",
261 "48770159A07DD8DFFF06C80105F8D57C",
262 "665E62801B3260E3C45BD3BE34DFDEBE",
263 "4159C1F686BFBE5B0E50BDB0DA532B69",
264 "6333100A5A4AD917DC2D4E78A04869A3",
265 "866A4519AB1D199F25886B89D0539ACC",
266 "EC0CFD37E4CBC7E8BE385283F7AEA75A",
267 "CA2F383AACCA0810AA13F3E710621422",
268 "1D0EEF6870444F950937831EC0A55D98",
269 "37839B35ED6801E7670496D479A95017",
270 "02317C8C7098C4F94AB867AC7A49DD8D",
271 "FFB4CB4E3F7F8BF3367EBD43236518B4",
272 "36BEDEF1E4AA3E4A40A305741713FCBF",
273 "B2DFE3C4870269C1E3FEEC39161540D9",
274 "147EF2518AD45DA0026056ECBF6A3DFA",
275 "027A75E4DE635790E47ACE90D7928804",
276 "C4CF3CCB59BF87D0AFBD629F48CFBB7B",
277 "35165C93F564C97E1C32EF97E8151A87",
278 "449DE37F7D5A1BBD628ABBE7E061701D",
279 "B1D45EAF218F1799B149BAD677FE129F",
280 "BE08AC6DB6BD0583AA9D2ABC71C73DCD",
281 "BCC835BD3DF1A79E4C7C145B899A5C25",
282 "3D311EA611FF5AF371301C58A8E9912D",
283 "A5A1BEA594ACC7CA80F09EA5ADDB5C71",
284 "0F09492429FE7222D6CD8190D9F2FFBF",
285 "816D2220A16B8AAEE71364FD43636C6F",
286 "D7E8702408419ED73191B107EAF75A0B",
287 "9B170EFB1E235B433C78E276BEA082F0",
288 "03BBECC5598AE974430F29395522F096",
289 "DB53517766C0E8CF42059607CBA89380",
290 "2E2AF4B7931F0AEFFAC5471148A5BB97",
291 "C872C0408266403B984F635FF5683DE4",
292 "15DCF750B0E3A68AD1F4EFD07E8967B4",
293 "B41092048E9E6A749F6FD8CE515A23A3",
294 "4DA9267D62507994312BD5C99ADDE730",
295 "9E2FCA6D1D626E9C6A924EBF7DBF618A",
296 "E092E8D7EF2C2465AEFB2493C3063590",
297 "1C0E58DA37D1068378A88DBE2EDE4E10",
298 "19063F854232B8509A6A3A6D46809959",
299 "447FB09E54EFA285F7530F25C4EA0022",
300 "F6ABE86321BE40E1FBFDAFED37CC1D9B",
301 "4E8506CD006666341D6CF51F98B41F35",
302 "53995DE0009CA18BECAFB8307C54C14C",
303 "2006BF99F4C58B6CC2627856593FAEEA",
304 "2DA697D2737CB30B744A4644FA1CBC6E",
305 "47A22ACDB60C3A986A8F76ECD0EA3433",
306 "FDAA17C2CDE20268FE36E164EA532151",
307 "98E7247C07F0FE411C267E4384B0F600",
308 "CD33B28AC773F74BA00ED1F312572435"
309         },
310         // Cipher Texts for 256-bit key
311         {
312 "DDC6BF790C15760D8D9AEB6F9A75FD4E",
313 "C7098C217C334D0C9BDF37EA13B0822C",
314 "60F0FB0D4C56A8D4EEFEC5264204042D",
315 "73376FBBF654D0686E0E84001477106B",
316 "2F443B52BA5F0C6EA0602C7C4FD259B6",
317 "75D11B0E3A68C4223D88DBF017977DD7",
318 "779B38D15BFFB63D8D609D551A5CC98E",
319 "5275F3D86B4FB8684593133EBFA53CD3",
320 "1CEF2074B336CEC62F12DEA2F6AB1481",
321 "1AEF5ABBAD9D7160874578DCD8BAE172",
322 "46C525DB17E72F26BF03216846B6F609",
323 "E24411F941BBE08788781E3EC52CBAA4",
324 "83A3DEDD1DD27018F6A6477E40527581",
325 "B68F8A2CDBAB0C923C67FC8F0F1087DE",
326 "649944A70C32BF87A7409E7AE128FDE8",
327 "2846526D67387539C89314DE9E0C2D02",
328 "A9A0B8402E53C70DD1688054BA58DDFD",
329 "4A72E6E1B79C83AC4BE3EBA5699EED48",
330 "B0E36B867BA4FF2B77D0614B0E364E4C",
331 "49B57DE141F6418E3090F24DDD4014B6",
332 "A6C0D5B9797258E1987AC5F6CD20146D",
333 "426CF4BDCAA369175965D26E7C71EEA2",
334 "E27F484CE54BC99BC1A52BDA3B518A26",
335 "D16D186284C7E6EE64B8104E0EF20BA5",
336 "6431F8538AD54E1E044A9F71F8EF556B",
337 "ECD57CEB451D27EB96C55B2042257E8E",
338 "4F0F188DC911B1954AFBC734C9F68872",
339 "B54DEF0337626B65614E81EDFDE620F3",
340 "6655D8074CAE0B90B0D3A3FE72D4D9DB",
341 "C6B74B6B9EB4FC0C9A237DB1B616D09A",
342 "D7B5D076EA56EC2B20791D7AD51CCF8F",
343 "FE160C224BF003CE3BDDC90CB52ED22C",
344 "5E00DA9BA94B5EC0D258D8A8002E0F6A",
345 "09AC6DCFF4DACFF1651E2BA212A292A3",
346 "B283617E318D99AF83A05D9810BA89F7",
347 "0B5F70CCB40B0EF2538AE9B4A9770B35",
348 "43282BF180248FB517839B37F4DDAAE4",
349 "DDBD534C8B2E6D30A268F88C55AD765B",
350 "A41A164E50EC2D9F175E752B755E0B5C",
351 "37BFF99FF2F7AA97779E4ADF6F13FB10",
352 "9BA4F7BD298152903A683C4CEC669216",
353 "5FB750C7CE10DE7B4504248914D0DA06",
354 "3E748BFA108E086F51D56EC74A9E0FB9",
355 "31D4E56B99F5B73C1B8437DF332AFB98",
356 "9DC6717B84FC55D266E7B1D9B5C52A5F",
357 "8EF8BA007F23C0A50FC120E07041BCCD",
358 "C58F38E1839FC1918A12B8C9E88C66B6",
359 "B695D72A3FCF508C4050E12E40061C2D",
360 "5D2736AD478A50583BC8C11BEFF16D7A",
361 "DF0EACA8F17847AD41F9578F14C7B56B",
362 "E5AA14AD48AD0A3C47CC35D5F8020E51",
363 "11BE6C8F58EBD8CEF1A53F591A68E8CE",
364 "ECFE7BAFCBF42C1FEE015488770B3053",
365 "E552649F8D8EC4A1E1CD6DF50B6E6777",
366 "521C0629DE93B9119CDB1DDC5809DDEA",
367 "CB38A62A0BAB1784156BA038CBA99BF6",
368 "76CCEE8AAACD394DE1EEF3DDA10CB54B",
369 "6AFF910FA1D5673140E2DB59B8416049",
370 "064A12C0EF73FB386801BF4F35F3120D",
371 "2240E374929D5B1BB8FF0FFDDDF640EC",
372 "D4BA15C904C7692185DE85C02052E180",
373 "1714A315AB0166728A44CD91D4AE9018",
374 "6C970BDD9F0E222722EA31A1D12DD0AD",
375 "F5956EDF02BD36A401BBB6CE77C3D3FB",
376 "0CA11F122CCD7C259DC597EED3DF9BC4",
377 "50109AB4912AD2560B206F331B62EB6C",
378 "DBE7C91A4175614889A2D4BEFD64845E",
379 "0D3322853A571A6B46B79C0228E0DD25",
380 "96E4EE0BB9A11C6FB8522F285BADDEB6",
381 "96705C52D2CFCE82E630C93477C79C49",
382 "C50130AED6A126149D71F3888C83C232",
383 "4816EFE3DEB380566EBA0C17BF582090",
384 "0390857B4C8C98E4CF7A2B6F3394C507",
385 "422E73A02025EBE8B8B5D6E0FA24FCB2",
386 "3271AA7F4BF1D7C38050A43076D4FF76",
387 "D2074946F0D37B8975607BFC2E70234C",
388 "1A509194C1270AB92E5A42D3A9F8D98B",
389 "512438946360CCC4A5C6D73F6EED7130",
390 "98CFCDEC46EBEA1A286B3004F2746A0D",
391 "A1CF369949677A3AF3D58E3EABF2741B",
392 "D84C2E1A0E4A52166FA8FF6889D1E5E2",
393 "4AD91CCEEF60119B5078FD162D2735DE",
394 "2860793D818E97AAFF1D339D7702438D",
395 "6F9068BE73364AE250D89D78A6C9CE6F",
396 "024FC3FEF4883FEB1A8DD005305FECCE",
397 "08A61FE0816D75EA15EB3C9FB9CCDED6",
398 "449C86DFA13F260175CE39797686FFA4",
399 "4FFFFC29A59858E1133F2BFB1A8A4817",
400 "19425D1F6480B25096561295697DC2B7",
401 "31974727ECDD2C77C3A428FC3A8CB3FC",
402 "A57CD704B3C95E744D08DF443458F2F5",
403 "486D8C193DB1ED73ACB17990442FC40B",
404 "5E4DBF4E83AB3BC055B9FCC7A6B3A763",
405 "ACF2E0A693FBBCBA4D41B861E0D89E37",
406 "32A7CB2AE066A51D2B78FC4B4CFCB608",
407 "677D494DBB73CAF55C1990158DA12F14",
408 "082A0D2367512ADF0D75A151BFBE0A17",
409 "5E5BB7337923C482CE8CBA249E6A8C7D",
410 "D3001BA7C7026EE3E5003179530AFCFC",
411 "46EC44F8931E629FE8FD8961312EDDE1",
412 "C5F8ECD79C7B30E81D17E32079969310",
413 "5B8AD6919E24CAEBCC55401AEE0C9802",
414 "C2302B7E701B5CC7F8B29E3516DBBFA6",
415 "A1D04D6A76F9F7A94D49FAA64A87F244",
416 "7FB6F92D35B5CB6C631600EDB9E860BA",
417 "B2EF7078BCFACE07AEEC3F9B48830EB3",
418 "F475A7493D24C7036E53390374C378B3",
419 "B36802AC987377A37BD8EADC97C57D60",
420 "ADDCD3D19689C4DDC738CE5F69DC9505",
421 "0DAF8CA22884915403C0F0BB1F4BD74F",
422 "4AF36BAE2660503B3248E4685059FD05",
423 "7D5631814DD8E917D97A0D514C743971",
424 "BC3352500FC0CBB9DB5B5F6B491C1BE8",
425 "6A4A30BA87E87AF65C90AEB7AFEDC76B",
426 "77E6125897668AC8E73E8C79A6FF8336",
427 "3FA9D39104EBB323C7AAAA248960DD1E",
428 "FAD75AD76AB10ADC49036B250E229D39",
429 "2FACAA5FE35B228A16AC74088D702EC4",
430 "88B6CBCFDFEF8AD91720A1BB69A1F33E",
431 "C7E9D250998632D444356242EF04058D",
432 "B14DAD8D3D9153F46C0D3A1AD63C7A05",
433 "60ABA678A506608D0845966D29B5F790",
434 "482DC43F2388EF25D24144E144BD834E",
435 "1490A05A7CEE43BDE98B56E309DC0126",
436 "ABFA77CD6E85DA245FB0BDC5E52CFC29",
437 "DD4AB1284D4AE17B41E85924470C36F7",
438 "CEA7403D4D606B6E074EC5D3BAF39D18",
439 "530F8AFBC74536B9A963B4F1C4CB738B"
440         }
441     };
442 
443     private static int[] KEY_SIZES = {
444         16, 24, 32
445     };
446 
447     /**
448      * Constructs an AES Key according to the specified key size.
449      * @param len key size in bytes, i.e. 16, 24, or 32
450      */
451     private static SecretKey constructAESKey(int len)
452         throws IllegalArgumentException {
453         if ((len != 16) && (len != 24) && (len != 32)) {
454             throw new IllegalArgumentException("Wrong Key Length: " + len);
455         }
456         byte[] keyval = new byte[len];
457         return new SecretKeySpec(keyval, "AES");
458     }
459     /**
460      * Constructs plain text byte array according to the specified round
461      * number.
462      * @param rounds round number starting from 0, i.e. valid from 0
463      * to 127.
464      */
465     private static byte[] constructPT(int rounds) {
466         byte[] tempValue = new byte[16];
467         Arrays.fill(tempValue, (byte)0);
468 
469         int whichByte = rounds/8;
470         int whichDigit = rounds % 8;
471         if ((whichByte >= 16) || (whichDigit < 0) ||
472             (whichDigit > 8)) {
473             throw new IllegalArgumentException("Invalid rounds: " +
474                                                rounds);
475         }
476         switch (whichDigit) {
477         case 0:
478             tempValue[whichByte] = (byte)0x80;
479             break;
480         case 1:
481             tempValue[whichByte] = (byte)0x40;
482             break;
483         case 2:
484             tempValue[whichByte] = (byte)0x20;
485             break;
486         case 3:
487             tempValue[whichByte] = (byte)0x10;
488             break;
489         case 4:
490             tempValue[whichByte] = (byte)0x08;
491             break;
492         case 5:
493             tempValue[whichByte] = (byte)0x04;
494             break;
495         case 6:
496             tempValue[whichByte] = (byte)0x02;
497             break;
498         case 7:
499             tempValue[whichByte] = (byte)0x01;
500             break;
501         }
502         return tempValue;
503     }
504 
505     private static byte[] constructByteArray(String s) {
506         int len = s.length()/2;
507         byte[] tempValue = new byte[len];
508         for (int i = 0; i < len; i++) {
509             tempValue[i] = Integer.valueOf(s.substring(2*i, 2*i+2),
510                                            16).byteValue();
511         }
512         return tempValue;
513     }
514 
515     public boolean execute() throws Exception {
516         String transformation = ALGO+"/"+MODE+"/"+PADDING;
517         Cipher c = Cipher.getInstance(transformation, "SunJCE");
518 
519         for (int i=0; i<KEY_SIZES.length; i++) {
520             if (KEY_SIZES[i]*8 >
521                 Cipher.getMaxAllowedKeyLength(transformation)) {
522                 // skip if this key length is larger than what's
523                 // configured in the jce jurisdiction policy files
524                 continue;
525             }
526             SecretKey aesKey = constructAESKey(KEY_SIZES[i]);
527             byte[] plainText = null;
528             byte[] cipherText = null;
529             try {
530             for (int j=0; j < 128; j++) {
531                 plainText = constructPT(j);
532                 c.init(Cipher.ENCRYPT_MODE, aesKey);
533                 cipherText = c.doFinal(plainText);
534                 byte[] answer = constructByteArray(CTS[i][j]);
535                 if (!Arrays.equals(cipherText, answer)) {
536                     throw new Exception((i+1) +
537                         "th known answer test failed for encryption");
538                 }
539                 c.init(Cipher.DECRYPT_MODE, aesKey);
540                 byte[] restored = c.doFinal(cipherText);
541                 if (!Arrays.equals(plainText, restored)) {
542                     throw new Exception((i+1) +
543                         "th known answer test failed for decryption");
544                 }
545             }
546             System.out.println(
547                 "Finished KAT for " + KEY_SIZES[i] + "-byte key");
548             } catch (SecurityException se) {
549                 TestUtil.handleSE(se);
550             }
551         }
552 
553         // passed all tests...hooray!
554         return true;
555     }
556 
557     public static void main (String[] args) throws Exception {
558         Security.addProvider(new com.sun.crypto.provider.SunJCE());
559 
560         TestKATForECB_VT test = new TestKATForECB_VT();
561         String testName = test.getClass().getName() + "[" + ALGO +
562             "/" + MODE + "/" + PADDING + "]";
563         if (test.execute()) {
564             System.out.println(testName + ": Passed!");
565         }
566     }
567 }